using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using AccesoDatos;
using Entidades;

namespace Negocio.Negocio
{
    // Clase Negocio
    internal class Cliente
    {
        #region Metodos publicos

        // Devuelve la lista de clientes
        public DataTable ListaCliente(String tipoDocumento, String nroDocumento,
            String apellidoPaterno, String apellidoMaterno, String nombre,
            String razonSocial, String codigoCliente)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                // Seteo de valores por defecto para los valores numericos
                if (tipoDocumento == "")
                {
                    tipoDocumento = "-1"; // Valor por defecto para buscar a todos
                }
                if (codigoCliente == "")
                {
                    codigoCliente = "-1"; // Valor por defecto para buscar a todos
                }

                Object[,] parmSP = { 
                    {"@tipoDocumento", SqlDbType.SmallInt, 4, tipoDocumento},
                    {"@nroDocumento", SqlDbType.VarChar, 20, nroDocumento},
                    {"@apellidoPaterno", SqlDbType.VarChar, 30, apellidoPaterno},
                    {"@apellidoMaterno", SqlDbType.VarChar, 30, apellidoMaterno},
                    {"@nombre", SqlDbType.VarChar, 20, nombre},
                    {"@razonSocial", SqlDbType.VarChar, 30, razonSocial},
                    {"@codigoCliente", SqlDbType.Int, 4, codigoCliente}
                };

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_Cliente", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("listaCliente() - " + ex.Message);
            }
        }

        // Inserta un cliente
        public bool InsertaCliente(Entidades.Cliente cliente)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                    {"@apellidoPaterno", SqlDbType.VarChar, 30, cliente.ApellidoPaterno},
                    {"@apellidoMaterno", SqlDbType.VarChar, 30, cliente.ApellidoMaterno},
                    {"@nombre", SqlDbType.VarChar, 20, cliente.Nombre},
                    {"@razonSocial", SqlDbType.VarChar, 30, cliente.RazonSocial},
                    {"@tipoTarjetaCredito", SqlDbType.Int, 4, cliente.TipoTarjeta},
                    {"@tarjetaCredito", SqlDbType.VarChar, 15, cliente.NroTarjeta},
                    {"@fechaVtoTarjCredito", SqlDbType.Char, 8, cliente.FecVenTarjetaCredito},
                    {"@tipoCliente", SqlDbType.SmallInt, 4, cliente.TipoCliente},
                    {"@tipoDocumento", SqlDbType.SmallInt, 4, cliente.TipoDocumento},
                    {"@numeroDocumento", SqlDbType.VarChar, 20, cliente.NroDocumento},
                    {"@personaContacto", SqlDbType.VarChar, 20, cliente.Contacto}
                };

                return (bool)oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_INS_Cliente", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("insertaCliente() - " + ex.Message);
            }
        }

        // Edita un cliente
        public bool EditaCliente(Entidades.Cliente cliente)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                    {"@codigoCliente", SqlDbType.Int, 4, cliente.CodigoCliente},                    
                    {"@apellidoPaterno", SqlDbType.VarChar, 30, cliente.ApellidoPaterno},
                    {"@apellidoMaterno", SqlDbType.VarChar, 30, cliente.ApellidoMaterno},
                    {"@nombre", SqlDbType.VarChar, 20, cliente.Nombre},
                    {"@tarjetaCredito", SqlDbType.VarChar, 15, cliente.NroTarjeta},
                    {"@razonSocial", SqlDbType.VarChar, 30, cliente.RazonSocial},
                    {"@fechaVtoTarjCredito", SqlDbType.Char, 8, cliente.FecVenTarjetaCredito},
                    {"@tipoCliente", SqlDbType.SmallInt, 4, cliente.TipoCliente},
                    {"@tipoTarjetaCredito", SqlDbType.Int, 4, cliente.TipoTarjeta},
                    {"@tipoDocumento", SqlDbType.SmallInt, 4, cliente.TipoDocumento},
                    {"@numeroDocumento", SqlDbType.VarChar, 20, cliente.NroDocumento},
                    {"@personaContacto", SqlDbType.VarChar, 20, cliente.Contacto},
                    {"@estado", SqlDbType.Char, 1, cliente.Estado}
                };

                return (bool)oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_UPD_Cliente", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("editaCliente() - " + ex.Message);
            }
        }

        // Elimina un cliente
        public bool EliminaCliente(Entidades.Cliente cliente)
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                Object[,] parmSP = { 
                    {"@codigoCliente", SqlDbType.Int, 4, cliente.CodigoCliente}
                };

                return (bool)oSql.ExecNonQuery(oRutGen.CadenaConexion(), "UP_VTA_DEL_Cliente", parmSP);
            }
            catch (Exception ex)
            {
                throw new Exception("eliminaCliente() - " + ex.Message);
            }
        }

        // Devuelve la lista de tipos de documentos
        public DataTable ListaTipoDocumento()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoDocumento");
            }
            catch (Exception ex)
            {
                throw new Exception("listaTipoDocumento() - " + ex.Message);
            }
        }

        // Devuelve la lista de tipos de clientes
        public DataTable ListaTipoCliente()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoCliente");
            }
            catch (Exception ex)
            {
                throw new Exception("listaTipoCliente() - " + ex.Message);
            }
        }

        // Devuelve la lista de tipos de tarjeta
        public DataTable ListaTipoTarjeta()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_TipoTarjeta");
            }
            catch (Exception ex)
            {
                throw new Exception("listaTipoTarjeta() - " + ex.Message);
            }
        }

        // Devuelve la lista de estados del cliente
        public DataTable ListaEstadoCliente()
        {
            try
            {
                SqlHelper oSql = new SqlHelper();
                RutinasGenericas oRutGen = new RutinasGenericas();

                return oSql.ExecSPReturnDataTable(oRutGen.CadenaConexion(), "UP_VTA_SEL_EstadoCliente");
            }
            catch (Exception ex)
            {
                throw new Exception("listaEstadoCliente() - " + ex.Message);
            }
        }

        #endregion
    }
}
